#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
#include <math.h>

int fd;  // 触摸屏设备文件描述符

// 定义滑动方向的枚举
typedef enum {
    DIR_NONE = 0,  // 无滑动
    DIR_UP,        // 上滑
    DIR_DOWN,      // 下滑
    DIR_LEFT,      // 左滑
    DIR_RIGHT      // 右滑
} Direction;

// 触摸事件结构体，包含所有返回信息
typedef struct {
    int x_down;    // 按下时的X坐标
    int y_down;    // 按下时的Y坐标
    int x_up;      // 松开时的X坐标
    int y_up;      // 松开时的Y坐标
    Direction dir; // 滑动方向
    int is_swipe;  // 是否构成滑动（距离超过阈值）
} TouchEvent;

// 初始化触摸屏设备
void InitTs() {
    fd = open("/dev/input/event6", O_RDONLY);
    if (fd < 0) {
        perror("open error");
        exit(EXIT_FAILURE);
    }
}

// 关闭触摸屏设备
void CloseTs() {
    close(fd);
}

// 获取触摸事件（坐标+方向）
TouchEvent getTouchEvent() {
    TouchEvent evt = {0};  // 初始化事件结构体
    struct input_event ev;
    int state = 0;         // 0:等待按下 1:已按下 2:已松开
    
    // 滑动距离阈值（像素），用于判断是否构成有效滑动
    const int SWIPE_THRESHOLD = 30;
    
    while (1) {
        memset(&ev, 0, sizeof(ev));
        int ret = read(fd, &ev, sizeof(ev));
        if (ret <= 0) continue;  // 读取失败，继续循环
        
        // 处理按键事件（按下/松开）
        if (ev.type == EV_KEY && ev.code == BTN_TOUCH) {
            if (ev.value == 1) {  // 按下事件
                state = 1;        // 进入"已按下"状态
                evt.x_down = 0;   // 重置坐标
                evt.y_down = 0;
                evt.x_up = 0;
                evt.y_up = 0;
            } 
            else if (ev.value == 0 && state == 1) {  // 松开事件
                evt.x_up = evt.x_down;  // 如果未读到坐标，使用最后一次值
                evt.y_up = evt.y_down;
                
                // 计算滑动距离和方向
                int dx = evt.x_up - evt.x_down;
                int dy = evt.y_up - evt.y_down;
                int distance = sqrt(dx*dx + dy*dy);
                
                // 判断是否构成有效滑动
                evt.is_swipe = (distance >= SWIPE_THRESHOLD);
                
                if (evt.is_swipe) {
                    // 比较X和Y方向的变化量
                    if (abs(dx) > abs(dy)) {
                        evt.dir = (dx > 0) ? DIR_RIGHT : DIR_LEFT;
                    } else {
                        evt.dir = (dy > 0) ? DIR_DOWN : DIR_UP;
                    }
                } else {
                    evt.dir = DIR_NONE;  // 不构成滑动
                }
                
                return evt;  // 返回事件结构体
            }
        }
        
        // 处理坐标事件（仅在"已按下"状态下记录）
        if (state == 1 && ev.type == EV_ABS) {
            if (ev.code == ABS_X) {
                evt.x_down = ev.value;  // 持续更新X坐标
            } else if (ev.code == ABS_Y) {
                evt.y_down = ev.value;  // 持续更新Y坐标
            }
        }
    }
}

int main() {
    InitTs();
    
    while (1) {
        TouchEvent evt = getTouchEvent();
        
        // 输出坐标信息
        printf("按下坐标: (%d, %d)\n", evt.x_down, evt.y_down);
        printf("松开坐标: (%d, %d)\n", evt.x_up, evt.y_up);
        
        // 输出滑动信息
        if (evt.is_swipe) {
            const char* dir_names[] = {"无滑动", "上滑", "下滑", "左滑", "右滑"};
            printf("滑动方向: %s\n", dir_names[evt.dir]);
        } else {
            printf("轻触操作（未构成滑动）\n");
        }
        
        printf("-----------------\n");
    }
    
    CloseTs();
    return 0;
}